% Nejprve uvedeme tridu dokumentu s volbami
\documentclass[bc,male,java,dept456]{diploma}						% jednostranny dokument
% \documentclass[bc,female,java,dept456,twoside]{diploma}		% oboustranny dokument
\usepackage[czech]{babel}
\usepackage[utf8]{inputenc}


% Zadame pozadovane vstupy pro generovani titulnich stran.
\Title{Šachový klient pro FICS}

\Author{David Juráň}

\SubmissionDate{3. května 2008}

\Thanks{Rád bych na tomto místě poděkoval všem, kteří mi s prací pomohli, protože bez nich by tato práce nevznikla.}

\CzechAbstract{Cílem této bakalářské práce je prozkoumat již existující šachové klienty pro server FICS. Zaměřuji se také na prostudování a popis existujících služeb serveru a na implementaci klienta podporujícího co nejvíce z těchto služeb. Následuje popis analýzy a rozbor grafického rozhraní aplikace. Dále práce obsahuje nejdůležitější část, a tou je samotná implementace, u které se soustřeďuji na co největší pohodlí pro uživatele. Na závěr se stručně věnuji použitým technologiím a plánům vývoje do budoucna.}

\CzechKeywords{šachy, FICS, Java , MySQL}

\EnglishAbstract{The aim of this bachelor thesis is to explore the already existing chess clients destined for server FICS. I also focus on research and description of the existing services offered by the server as well as on the implementation of a client supporting majority of these services. 
The next part provides the analysis description and analysis of graphical user interface of the application. The following and also the most important section of the thesis is the implementation itself, where I concentrate on the provision of the greatest user comfort. Finally, I briefly deal with used technologies and plans of development in the future.}

\EnglishKeywords{chess, FICS, Java , MySQL}

% Pridame pouzivane zkratky (pokud nejake pouzivame).
\AddAcronym{API}{Application Programming Interface}
\AddAcronym{FICS}{Free Internet Chess Server}
\AddAcronym{GPL}{General Public License}
\AddAcronym{GUI}{Graphical User Interface}
\AddAcronym{HTML}{HyperText Markup Language}
\AddAcronym{ICC}{Internet Chess Club}
\AddAcronym{J2SE}{Java 2 Platform Standard Edition}
\AddAcronym{JVM}{Java Virtual Machine}
\AddAcronym{KDE}{Kde Desktop Enviroment}
\AddAcronym{OS}{Operační Systém}
\AddAcronym{PGN}{Portable Game Notation}
\AddAcronym{SQL}{Structured Query Language}
\AddAcronym{SŘBD}{Systém Řízení Báze Dat}
\AddAcronym{Wine}{Wine Is Not Emulator}
\AddAcronym{XML}{Extensible Markup Language}

% Zacatek dokumentu
\begin{document}

% Nechame vysazet titulni strany.
\MakeTitlePages

% Asi urcite budeme potrebovat obsah prace.
\tableofcontents

% Jsou v praci tabulky? Pokud ano vysazime jejich seznam.
% Pokud ne smazeme nasledujici makro.
\listoftables

% Jsou v praci obrazky? Pokud ano vysazime jejich seznam.
\listoffigures

% Jsou v praci vypisy programu? Pokud ano vysazime jejich seznam.
\lstlistoflistings

% Odstrankujeme.
\clearpage


% Zacneme uvodem
\section{Úvod}
\label{sec:Uvod}

\subsection{Motivace}
Již přibližně tři roky hraji šachy prostřednictvím serveru FICS. Jako klienta jsem vždy používal BabasChess, ale z důvodu toho, že jsem přešel na operační systém OpenSuse 10.2, jsem jej dále nemohl používat. Proto jsem začal hledat klienta, který by mi vyhovoval. Mezi klienty, které jsem vyzkoušel, patří Knights, Varese a Jin. U posledně jmenovaného jsem zůstal. Přestože byl nejkvalitnější, rozhodně nebyl pohodlný pro hraní šachu na serveru, jelikož se většina věcí nastavuje přes konzoli. Tak jsem se rozhodl vyvinout klienta, který bude pro hráče dostatečně uživatelsky přívětivý.
\subsection{Cíle práce}
Cílem této práce je prozkoumat služby šachového serveru FICS a navrhnout grafické rozhraní podporující co nejvíce  služeb, které server nabízí. To znamená vytvořit klienta, díky kterému bude hraní jednoduché a skoro vůbec se nebude muset používat konzole k přístupu ke službám serveru.

%\LaTeX{}\verb|diploma|.
%V kapitole \ref{sec:Exist} 


%\uv{jako závěr}


\section{Prozkoumání existujících řešení}
\label{sec:Exist}


\subsection{BabasChess}
BabasChess je šachové prostředí vyvíjeno od roku 2003 a nyní je dostupné již ve své čtvrté verzi. Mezi podporované systémy patří Windows 95/98/ME/NT/2000/XP/Vista. Tvůrci uvádějí, že je možno jej používat i na Linuxu, ale to pouze za pomocí Wine (program umožňující chod aplikací pro Microsoft Windows pod unixovými OS).  
\begin{description}
 \item[Aplikaci si můžete stáhnout na adrese :]
 http://www.babaschess.net
\end{description}


\textbf{Výhody:}
\begin{itemize}
 \item Snadné ovládání
 \item Podpora BugHouse
 \item Podpora PGN
 \item Podpora mnoha jazyků (Angličtina, Němčina, Španělština, ..)
\end{itemize}


\textbf{Nevýhody:}
\begin{itemize}
 \item Není multiplatformní
 \item Neobsahuje databázové funkce
\end{itemize}

\subsection{Jin}
Jin je projekt, který vyvíjel vývojář jménem Alexander Maryanovsky od roku 2002 do roku 2007. Nadále se již nevyvíjí. Tento klient je napsán v Javě a je pod licencí GPL, takže má otevřený zdrojový kód. Podporované servery jsou FICS a ICC. Jelikož je klient napsán v Javě, tak je multiplatformní. 
\begin{description}
 \item[Aplikaci a zdrojové kódy naleznete na adrese:]
 http://www.jinchess.com/download
\end{description}

\begin{description}
 \item[Applet můžete najít na adrese:]
 http://www.freechess.org/Login/jin/  
\end{description}

\textbf{Výhody:}
\begin{itemize}
 \item Multiplatformnost
 \item Existuje verze jako applet
 \item Otevřený zdrojový kód
\end{itemize}


\textbf{Nevýhody:}
\begin{itemize}
 \item Ovládání z velké části přes konzolu
 \item Neobsahuje databázové funkce
 \item Dále se nevyvíjí
\end{itemize}


\subsection{Knights}
Jedná se o klienta vyvíjeného od roku 2003 vývojářem jménem Troy Corbin Jr. Dnes se zdá, že vývoj byl již ukončen, i když to nebylo oficiálně oznámeno. Klient je vyvíjen speciálně pro linuxové prostředí KDE. Je to jednoduchý klient zaměřený spíše na hru člověka proti počítači než na hraní přes server FICS.
\begin{description}
 \item[Adresa pro stáhnutí aplikace:]
 http://knights.sourceforge.net/download.php
\end{description}

\textbf{Výhody:}
\begin{itemize}
 \item Možnost hry proti počítači
 \item Mnoho témat pro vzhled
\end{itemize}

\textbf{Nevýhody:}
\begin{itemize}
 \item Pouze pro Linux
 \item Slabá podpora funkcí pro FICS
 \item Nepřehledné ovládání pro hraní přes FICS
\end{itemize}

\subsection{Xboard a Winboard}
Xboard a Winboard je vlastně jeden a ten samý klient. Nejdříve vznikl Xboard a potom jako portace na Windows vznikl Winboard. Jde o poměrně starého klienta se zastaralým uživatelským rozhraním, ale zato s poměrně příjemným ovládáním. Klient je vyvíjen pod licencí GPL. 
\begin{description}
 \item[Možnost stažení na adrese:]
 http://ftp.gnu.org/gnu/xboard/
\end{description}

\textbf{Výhody:}
\begin{itemize}
 \item Nejpoužívanější
 \item Podpora PGN
 \item Možnost hry proti počítači
\end{itemize}

\textbf{Nevýhody:}
\begin{itemize}
 \item Zastaralé
 \item Dále se nevyvíjí
\end{itemize}

\subsection{JavaBoard}
JavaBoard byl vyvinut přímo jako applet pro možnost hrát přes FICS server bez nutnosti stahování klienta do počítače. 
\begin{description}
 \item[Adresa umístění appletu:]
 http://www.freechess.org/javaboard/
 \end{description}
\textbf{Výhody:}
\begin{itemize}
 \item Multiplatformnost
\end{itemize}
\textbf{Nevýhody:}
\begin{itemize}
 \item Pouze jako applet
 \item Slabá podpora funkcí FICS
 \item Ovládání hlavně přes konzolu
\end{itemize}

\paragraph*{}
\paragraph*{}
\noindent
\noindent V příloze naleznete obrázky s náhledy jednotlivých klientů.

\section{Podporované služby serveru a jejich komunikační protokoly}
\label{sec:Sluzby}
\subsection{Chat}
\label{sec:chat}
Server poskytuje službu, která umožňuje komunikaci mezi hráči. Komunikace se dá na serveru rozdělit do tří částí: Komunikace při hře, Zprávy určitému hráči, Komunikace v místnostech.
\subsubsection{Komunikace při hře:}
Jedná se o zprávy mezi lidmi, kteří buď hrají, anebo pozorují probíhající hru.
\paragraph*{Protokol:}

\begin{description}
\item[Poslání zprávy:]
 say $<$text zprávy$>$
\end{description}

\begin{description}
\item[Zobrazení zprávy serverem:]
 game [číslo hry] $<$text zprávy$>$
\end{description}
\subsubsection{Zprávy určitému hráči:}
Jde o poslání zprávy určitému hráči. Existují dva druhy a to přímé poslání zprávy a poslání zprávy, která bude uložena na server (výhoda toho je, že může být poslána zpráva i hráči, který není zrovna připojen).
\paragraph*{Protokol:}
\begin{description}
 \item[Poslání zprávy:]
 tell [login hráče] $<$text zprávy$>$

 \item[Zobrazení zprávy serverem:]
 [login hráče] tells you $<$text zprávy$>$

 \item[Zpráva ukládána na server:]
 messages [login hráče] $<$text zprávy$>$

 \item[Přečtení zprávy ze serveru:]
 messages [číslo zprávy $|$ login hráče]
\end{description}

\subsubsection{Komunikace v místnostech:}
Server poskytuje ke komunikaci také okolo 250 místností, do kterých je možné se přihlásit a diskutovat o určitých tématech. Témata jsou dána v názvech místností.

\paragraph*{Protokol:}
\begin{description}
 \item[Poslání zprávy:]
 tell [číslo místnosti] $<$text zprávy$>$

 \item[Zobrazení zprávy serverem:]
 [login hráče] (číslo místnosti) $<$text zprávy$>$
\end{description}

\subsection{Nastavení proměnných}
Proměnné slouží k nastavení chování serveru. Výhodné pro specifické nastavení pro jednotlivé šachové klienty.
Proměnné se neukládají pro každého hráče, proto musí být při každém přihlášení na server nastaveny znovu. Každá proměnná má pouze dva stavy, a to jestli je vypnuta nebo zapnuta. 

\subsubsection{Použití:}
\begin{description}
\item[vypnutí:]
 iset $<$název proměnné$>$ 0 

\item[zapnutí:]
 iset $<$název proměnné$>$ 1

\item[seznam nastavení proměnných:]
 ivariables $[$login hráče$]$
\end{description}

\subsubsection{Seznam vybraných proměnných:}
\begin{description}
\item[seekinfo]
posílá informace o nabízených hrách.

\item[compressmove]
posílá pouze zjednodušené informace o tazích.

\item[gameinfo]
posílá parametry hry(typ hry, čas, ...) při každém vytvoření nové hry nebo pozorování cizí hry.

\item[pendinfo]
zlepšený zápis informací o nabídnutí hry.

\item[lock]
uzamkne možnost změny proměnných do příštího přihlášení.
\end{description}

\subsection{Nabízené hry}
\label{sec:sought}
Hru lze na serveru vytvořit pomocí nabízení her. Hra lze nabídnout buď určitému hráči, anebo všem (popřípadě lze nastavit některá kritéria, jako například rating hráčů, kterých se tato nabídka týká). Pokud hráči mají zapnutou funkci sledování nabízených her, tak vidí všechny nabídky, ze kterých si mohou vybrat a hru přijmout.

\paragraph*{Protokol:}
\begin{description}
 \item[Poslání výzvy hráči:]
 user [rated$|$unrated] [čas] [přírůstek] [White$|$Black] 

 \item[Poslání výzvy všem:]
 seek [čas] [přírůstek] [rated$|$unrated] [white$|$black] [crazyhouse] [suicide]
            [wild \#] [auto$|$manual] [formula] [rating-range]
\begin{itemize}
 \item čas - klasická délka hry (v minutách)
 \item přírůstek - k času hráče se při každém jeho tahu přičte hodnota daná přírůstkem (v sekundách)
 \item rated$|$unrated - jestli se bude výsledek započítávat do Ratingu
 \item white$|$black - bílé nebo černé figury
 \item crazyhouse - styl hry, při kterém při sebrání figury ji získáváte na svou stranu
 \item suicide - styl hry, při kterém je cílem přijít o všechny své figury
 \item wild - další styl hry, který má více typů proto následuje číslo
 \item auto$|$manual - jestli má hra začít automaticky v okamžiku kdy soupeř přijme výzvu nebo máte být dotázáni
 \item formula - jestli se má použít formule pro filtrování odpovědí na výzvu
 \item rating-range - lze zvolit Rating soupeřů, pro které je výzva určena (například 900-1500)
\end{itemize}
 \item [Zobrazení výzvy pro určitého hráče serverem:]
 Challenge: (hráč1) (hráč2) [rated$|$unrated] [typ hry][čas] [přírůstek].
 You can "accept" or "decline", or propose different parameters.
 
 \item [Zobrazení obecné výzvy serverem(při zapnuté proměnné "seekinfo"):]
 $<$s$>$ [číslo hry] w=[login] ti=02 rt=[rating] t=[čas] i=[přírůstek] r=[rated$|$unrated] tp=[typ] c=[barva] rr=[rozsah ratingu] a=[automatické přijetí] f=[formula]
\end{description}

\subsection{Statistiky}
Server nabízí pár možností jak se informovat o statistikách. Jednak je to zjištění informací o posledních deseti hrách určitého hráče, anebo počet všech her (výher, proher, remíz) rozdělený do kategorií podle typu her. Jelikož mi to přijde nedostatečné, naimplementoval jsem do svého klienta databázové funkce, díky kterým lze zjistit výsledky všech vašich her a bilance odehraných partií s určitým hráčem.

\subsubsection{Protokol:}
\begin{description}
\item[Posledních deset her:]
 history $<$login hráče$>$ 

\item[Celková statistika her:]
 stats $<$login hráče$>$
\end{description}

\subsection{Hra}
\label{sec:hra}
Hra je základní část, kterou server poskytuje. Pro ovládání hry se používají tahy, ale také příkazy, které umožňují řízení hry.
\subsubsection{Příkazy:}
\begin{itemize}
 \item abort - požadavek, aby byla hra zrušena
 \item adjourn - požadavek, aby byla hra odložena na jindy
 \item draw - požadavek pro remízu
 \item flag - slouží k ukončení partie, když protihráči vypršel čas a server to nezaznamenal 
 \item moves - server pošle tahy ke hře, kterou hrajete
 \item pause - požadavek o krátké pozdržení hry
 \item promote - nastavuje, na jakou figuru se má změnit pěšec, když dosáhne posledního pole
 \item refresh - pošle znovu pozici všech figur na šachovnici
 \item resign - tímto příkazem hráč vzdává partii
 \item switch - požadavek o výměnu barev figur
 \item takeback - požadavek o vrácení jednoho tahu
 \item unpause - požadavek o znovu spuštění pozdržené hry
 \item withdraw - zrušení požadavku, který jste udělal
\end{itemize}

Nejdůležitější částí pro hru jsou ale tahy. Jedná se o informace, které jsou posílány serveru, když provedete tah a server je dále pošle vašemu protihráči. Stejně tak, když váš soupeř provede tah, jeho klient pošle informace o tahu serveru a server následně vám. FICS nabízí 13 možností jak tyto informace předávat. Ale mezi nejpoužívanější patří "style12", který také používám ve svém klientu.

\subsubsection{Protokol:}
\label{sec:style12protokol}
\begin{description}
\item[vámi provedený tah:]
 [pozice odkud][pozice kam] například e2e4

\item[příklad informace o tahu (style12):]
 $<$12$>$ rnbqkb-r pppppppp -----n-- -------- ----P--- -------- PPPPKPPP RNBQ-BNR
 B -1 0 0 1 1 0 7 Newton Einstein 1 2 12 39 39 119 122 2 K/e1-e2 (0:06) Ke2 0
\begin{itemize}
\item "$<$12$>$" identifikace, že se jedná o tah popsaný protokolem style12
\item 8 polí, které reprezentují jednotlivá pole na šachovnici
\item barva figur toho, co je na tahu ("B" nebo "W")
\item -1 jestliže tah nebyl o dva pěšcem, jinak pozice kde byl tah o 2 proveden
\item může bílý stále udělat krátkou rošádu (0=ne, 1=ano)
\item může bílý stále udělat dlouhou rošádu
\item může černý stále udělat krátkou rošádu
\item může černý stále udělat dlouhou rošádu
\item počet tahů. Jestliže je $>=$ 100, hra může být považována za remízu
\item číslo hry
\item login hráče s bílými figurami
\item login hráče s černými figurami
\item vaše pozice v této hře:
    \begin{description}
	\item[-3] při zobrazování pouze pozic
	\item[-2] pozorujete hru, která je hodnocena
	\item[2] jste hodnotící této hry
	\item[-1] hrajete, tah protihráče
	\item[1] hrajete, váš tah 
	\item[0] pozorujete hru hranou jinými hráči
     \end{description} 
\item čas partie (v sekundách)
\item přírůstek (v sekundách)
\item Materiální hodnota bílého figur
\item Materiální hodnota černého figur
\item Zbývající čas bílého
\item Zbývající čas černého
\item číslo tahu (standardní počítání: bílého i černého první tah počítán jako 1)
\item speciální zápis předchozího tahu ("none" jestliže žádný nebyl)
\item čas, který trval předchozí tah "(min:sec)".
\item zjednodušený zápis předchozího tahu ("none" jestliže žádný nebyl)
\item orientace šachovnice: 1 = černé figury dole na šachovnici, 0 = bílé figury dole na šachovnici
\end{itemize}
\end{description}

\subsection{Odložené hry}
Funkce odložených her slouží tehdy, když nějaká hra nemůže být dohrána. Stává se tak buď když o odložení hry požádá jeden z hráčů (druhý hráč může nebo nemusí žádost přijmout), nebo když jeden z hráčů ztratí spojení se serverem. V ten moment se pozice hry ukládá na server až do té doby, než ji hráči dohrají. Každý hráč může mít však maximálně 16 odložených her. Další pravidlo je, že pokud chceme hrát hru s hráčem, se kterým již máme odloženou hru, tak musíme nejdříve dohrát tu odloženou.
\subsubsection{Příkazy:}
\begin{description}
\item[požadavek o odložení hry:]
 adjourn
\item[obnovení odložené hry:]
 match$|$resume
\item[zobrazení seznamu vašich odložených her:]
 stored
\item[zobrazení pozic figur v odložené hře:]
 sposition $<$login hráče$>$
\item[přehodnocení adminem při nemožnosti hru dohrát:]
 message adjudicate $<$login bílého$>$ $<$login černého$>$ $<$výsledek$>$ $<$poznámky$>$
\end{description}




\section{Návrh implementace}
\label{sec:Navrh}
% \InsertFigure{vrstvy2}{40mm}{Pokusný obrázek -- absolutní velikost}{fig:SampleFigAbs}
\subsection{Specifikace požadavků}
Cílem této práce je vytvořit grafického klienta pro šachový server FICS. Jeden z požadavků je funkčnost klienta pod OS typu Linux. Klient by měl umožnit připojení na server a přes grafické rozhraní zpřístupnit tyto funkce:
\begin{description}
\item[Přihlášení:]
 přihlášení by mělo obsahovat možnost přihlášení jak registrovaného hráče, tak hráče neregistrovaného
\item[Hru:]
 hraní šachu a to ve variantách lightning, blitz, standard a untimed (Tyto varianty se od sebe liší pouze v různé časové délce partie)
\item[Pozorování hry:]
 jedná se o funkci observe která umožňuje sledovat jakoukoliv probíhající partii na serveru
\item[Chat:]
 možnost komunikace se soupeřem v partii a s uživateli na přihlášených kanálech
\item[Zobrazení nabízených her:]
 jedná se o seznam nabízených partií ostatními uživateli, a to včetně všech potřebných informací (jméno hráče který hru nabízí, typ partie, čas partie, ...)
\item[Nabízení her:]
 možnost nabídnout určitý druh hry
\item[Statistiky:]
 Informace o odehraných hrách a vzájemné bilance s jednotlivými hráči
\end{description}

\subsection{Rozdělení vrstev}
\label{sec:rozdeleni_vrstev}
\InsertFigure{vrstvy}{0.9\textwidth}{Diagram vrstev}{fig:vrstvy}
Základní rozdělení programu lze rozdělit do vrstev, a to do tří základních :
\begin{enumerate}
 \item připojení k serveru
\item parser
\item grafické uživatelské rozhraní
\end{enumerate}
Úplné rozdělení vrstev lze vidět na obrázku \ref{fig:vrstvy}. Proti základnímu rozdělení je rozdíl v tom, že se vrstvy skládají z více vláken. Popis jednotlivých částí:
\begin{description}
\item[Reader:]
 tato třída zajišťuje vypisování všech informací ze serveru do konzole. Stejně tak se stará o posílání příkazů na server z konzole. Dále se stará s pomocí třídy MySQLConnection o zápis všech důležitých informací do databáze. Dále se stará o výpis informativních zpráv při důležitých událostech.
\item[Style12:]
 u této třídy je úkolem parsovat protokol style12, který se stará o samotnou hru, viz kapitola \ref{sec:style12protokol}. Informace o pozicích figur se zobrazují na šachovnici a informace o hře na informační panel, hned vedle šachovnice.
\item[ChatParser:]
 parsování v této třídě spočívá v tom, že se musí rozpoznávat, které informace ze serveru se týkají komunikace mezi hráči, viz protokoly v kapitole \ref{sec:chat}. Tyto zprávy pak rozděluje do jednotlivých kanálů a zobrazuje v jednotlivých tabech okna.
\item[Sought:]
 tato třída zajišťuje parsování a výpis informací o nabízených hrách hráčů na serveru. Protokol výpisů nabízených her je popsán v kapitole číslo \ref{sec:sought} v sekci: Zobrazení obecné výzvy serverem (při zapnuté proměnné "seekinfo").
\end{description}

\subsection{Struktura}
\subsubsection{Návrh grafické části klienta}
\InsertSidewaysFigure{Diagram_trid_gui}{0.8\textheight}{Třídní diagram - návrh GUI části programu}{fig:tridni_gui}
Podrobnou strukturu GUI aplikace lze vidět na obrázku číslo \ref{fig:tridni_gui}. Struktura GUI je naimplementována pomocí JDesktopPane a JInternalFrame, což je součást API Java 2 SE. Základní částí je třída Desktop.java, která představuje hlavní okno obsahující menu a jednotlivá vnitřní okna. Vnitřní okna mají společného rodiče v podobě třídy InternalFrame.java, která obsahuje metody například pro nastavení velikosti okna. Vzhled celé aplikace je nastaven za pomocí funkce jazyku Java, a tou je Synth Look And Feel. Zde bylo použito téma Lipstik LookAndFeel, které volně dostupné pod licencí GPL.

\subsubsection{Struktura výkonné části klienta}
Na obrázku číslo \ref{fig:tridni_vlakna} je třídní diagram vyobrazující návrh jednotlivých parserů jako vláken. Popis funkcí jednotlivých parserů je již popsán v kapitole číslo \ref{sec:rozdeleni_vrstev}, která se věnuje rozdělení vrstev aplikace. Pro ukázku návrhu parseru protokolu style12 a jeho součástí jsem přidal odpovídající třídní diagram (viz. obrázek číslo \ref{fig:tridni_style12}).

\InsertFigure{vlakna}{1\textwidth}{Třídní diagram - návrh připojení a jednotlivých vláken}{fig:tridni_vlakna}
\InsertSidewaysFigure{style12}{0.7\textheight}{Třídní diagram - návrh vlákna parseru a jeho součástí pro protokol style12}{fig:tridni_style12}

\subsection{Návrh databáze}
Databázové funkce jsou ke klientovi připojeny z důvodu, že server FICS jen slabě podporuje funkce statistik.
\subsubsection{Struktura}
Jedná se o malou databázi s jednoduchou strukturou. Strukturu lze nejlépe vidět na ERD v kapitole \ref{sec:er}. Databáze se skládá z pěti tabulek:
\begin{description}
\item[Games:]
 jedná se o tabulku, ve které jsou uchovávány informace o jednotlivých hrách (výsledek, datum hry, ...).
\item[Moves:]
 zde jsou ukládány jednotlivé tahy v závislosti s jednotlivými partiemi
\item[Player:]
 tabulka pro informace o protihráčích, se kterými jsem již někdy hrál (jméno, počet výher, ...).
\item[Session:]
 zde se ukládají informace o jednotlivých session. Což vlastně znamená od spuštění programu do ukončení.
\item[Tournaments:]
 ukládání informací o odehraných nebo právě probíhajících turnajích.
\end{description}

\subsubsection{Datová analýza}

\paragraph{Lineární zápis}
\paragraph*{}
Legenda:\textbf{Primární klíč}, \underline{cizí klíč}
\begin{description}
\item[Games](\textbf{id\_game}, style, time\_limit\_game, colour, result, game\_date, time\_game, \underline{login}, \underline{id\_tournament}, \underline{id\_session})
\item[Moves]
 (\textbf{id\_move}, move\_number, from, to, time, \underline{id\_game}, \underline{login})
\item[Player]
 (\textbf{login}, email, create\_date, best\_rating, Note, won, lost, drawn, last\_rating)
\item[Session]
 (\textbf{id\_session}, game\_won, game\_lost, game\_drawn,date\_game, spend\_time)
\item[Tournaments]
 (\textbf{id\_tournament}, game\_type, time\_limit, number\_of\_players, final\_place, starting\_time, starting\_date)
\end{description}
\paragraph{Diagram entit a jejich vztahů}
\label{sec:er}
\InsertFigure{ERD2}{0.9\textwidth}{Entity relationship diagram}{fig:erd}
\paragraph*{}
Diagram lze vidět na ER diagramu na obrázku číslo \ref{fig:erd}.
\paragraph{Popis vztahů}
\begin{description}
\item[Are\_in](Session, Games) 1:N
\item[Include](Tournament , Games) 1:N
\item[Has](Games, Moves) 1:N
\item[Play](Player, Games) 2:N
\end{description}
% \paragraph*{}
\paragraph{Datový slovník}
\paragraph*{}
Datový slovník databáze se skládá z tabulek číslo \ref{tab:datovySlovnik_session}, \ref{tab:datovySlovnik_tournament}, \ref{tab:datovySlovnik_moves}, \ref{tab:datovySlovnik_games} a \ref{tab:datovySlovnik_player}.
\begin{table}
  \centering
  \begin{tabular}{|l|l|r|r|c|c|l|}
\multicolumn{7}{c}{\textbf{Session}}\\
\hline
	\textbf{Atribut} & \textbf{Dat. typ} & \textbf{Vel.} & \textbf{Klíč} & \textbf{Null} & \textbf{Index} & \textbf{Popis} \\
\hline
id\_session & int & 4 & PK & N & N & auto\_increment \\
\hline
game\_won & int & 4 & N & N & N & počet výher \\
\hline
game\_lost & int & 4 & N & N & N & počet proher \\
\hline
game\_drawn & int & 4 & N & N & N & počet remíz \\
\hline
date\_game & date & 30 & N & N & N & datum sezení \\
\hline
spend\_time & time & 4 & N & Y & N & strávený čas \\
\hline
  \end{tabular}
  \caption{Datový slovník - tabulka Session}
  \label{tab:datovySlovnik_session}
\end{table}

\begin{table}
  \centering
  \begin{tabular}{|l|l|r|r|c|c|l|}
\multicolumn{7}{c}{\textbf{Tournament}}\\
\hline
	\textbf{Atribut} & \textbf{Dat. typ} & \textbf{Vel.} & \textbf{Klíč} & \textbf{Null} & \textbf{Index} & \textbf{Popis} \\
    \hline
id\_tournament & int & 3 & PK & N & Y & auto\_increment \\
\hline
game\_type & varchar & 10 & N & N & N & typ hry \\
\hline
time\_limit & int & 5 & N & N & N & délka hry \\
\hline
number\_of\_players & int & 3 & N & N & N & počet účastníků turnaje \\
\hline
final\_place & int & 3 & N & N & N & konečné umístění \\
\hline
starting\_time & time & 30 & N & N & N & čas začátku \\
\hline
starting\_date & date & 30 & N & N & N & datum začátku \\
\hline
  \end{tabular}
  \caption{Datový slovník - tabulka Tournament}
  \label{tab:datovySlovnik_tournament}
\end{table}
\begin{table}
  \centering
  \begin{tabular}{|l|l|r|r|c|c|l|}
\multicolumn{7}{c}{\textbf{Moves}}\\
\hline
	\textbf{Atribut} & \textbf{Dat. typ} & \textbf{Vel.} & \textbf{Klíč} & \textbf{Null} & \textbf{Index} & \textbf{Popis} \\
\hline
id\_move & int & 10 & PK & N & Y & auto\_increment \\
\hline
move\_number & int & 3 & N & N & N & číslo tahu v partii \\
\hline
from & varchar & 5 & N & N & N & výchozí pole \\
\hline
to & varchar & 5 & N & N & N & cílové pole \\
\hline
time & int & 4 & N & N & N & čas tahu \\
\hline
id\_game & int & 5 & FK & N & N & hra, do které tah patří \\
\hline
login & vachar & 10 & FK & N & N & autor tahu  \\
\hline
  \end{tabular}
  \caption{Datový slovník - tabulka Moves}
  \label{tab:datovySlovnik_moves}
\end{table}
\begin{table}
  \centering
  \begin{tabular}{|l|l|r|r|c|c|l|}
\multicolumn{7}{c}{\textbf{Games}}\\
\hline
	\textbf{Atribut} & \textbf{Dat. typ} & \textbf{Vel.} & \textbf{Klíč} & \textbf{Null} & \textbf{Index} & \textbf{Popis} \\
\hline
id\_game & int & 5 & PK & N & Y & auto\_increment \\
\hline
style & varchar & 8 & N & N & N & typ hry \\
\hline
time\_limit\_game & int & 3 & N & N & N & délka partie \\
\hline
colour & varchar & 5 & N & N & N & barva (uživatel) \\
\hline
result & varchar & 10 & N & N & N & výsledek (uživatel) \\
\hline
game\_date & date & 30 & N & N & N & datum hry \\
\hline
time\_game & time & 30 & N & N & N & čas hry \\
\hline
login & vachar & 10 & FK & N & N & login oponenta  \\
\hline
id\_tournament & int & 3 & FK & Y & N & turnaj obsahující hru \\
\hline
id\_session & int & 4 & FK & N & N & session obsahující hru \\
\hline
  \end{tabular}
  \caption{Datový slovník - tabulka Games}
  \label{tab:datovySlovnik_games}
\end{table}

\begin{table}
  \centering
  \begin{tabular}{|l|l|r|r|c|c|l|}
\multicolumn{7}{c}{\textbf{Player}}\\
    \hline
	\textbf{Atribut} & \textbf{Dat. typ} & \textbf{Vel.} & \textbf{Klíč} & \textbf{Null} & \textbf{Index} & \textbf{Popis} \\
    \hline
    login & vachar & 15 & PK & N & Y & přihlašovací jméno  \\
    \hline
    email & varchar & 20 & N & Y & N &  \\
    \hline
    create\_date & int & 8 & N & Y & N & datum vytvoření účtu \\
    \hline
    best\_rating & int & 4 & N & Y & N & nejlepší rating \\
\hline
note & varchar & 50 & N & Y & N & poznámka \\
\hline
won & int & 4 & N & N & N & počet výher\\
\hline
lost & int & 4 & N & N & N & počet proher \\
\hline
drawn & int & 4 & N & N & N & počet remíz \\
\hline
last\_rating & int & 4 & N & Y & N & rating při poslední hře \\
\hline
  \end{tabular}
  \caption{Datový slovník - tabulka Player}
  \label{tab:datovySlovnik_player}
\end{table}




\paragraph*{}
\paragraph*{}
% \InsertSidewaysFigure{vrstvy2}{0.6\textheight}{Pokusný obrázek --  naležato}{fig:SampleFigSideway}
\subsection{Ukázky zdrojového kódu}
V této části bych chtěl ukázat některé části zdrojových kódů. Jako první je ukázka části parseru protokolu style12 (viz. výpis číslo \ref{src:Style12_parser}). V metodě parse lze vidět, jak se ve dvojitém cyklu přečte 8x8 polí reprezentujících pozice figur na šachovnici a uloží do dvourozměrného pole. Dále se načte zbytek řádku po prvcích do jednoduchého pole. Následují metoda getBoardPositions, která vrací dvojrozměrné pole obsahující pozice jednotlivých figur. Dále parser obsahuje sadu get metod, které vrací odpovídající hodnotu z jednoduchého pole words. Viz. například metoda getColor, která vrací hodnotu reprezentující barvu figur hráče, který je na tahu.
\begin{lstlisting}[label=src:Style12_parser,caption=Ukázka části třídy parseru protokolu style12]
/**
 * Uklada pozice figur a nasledujici informace style12 do poli
 */
private void parse() {
	logger.debug("STYLE12: " + line);
	StringTokenizer token = new StringTokenizer(line);
	String pom;
	for (int i = 0; i < 8; i++) {
		pom = token.nextToken();
		for (int j = 0; j < 8; j++) {
			positions[j][i] = String.valueOf(pom.charAt(j));
		}
	}
	for (int i = 0; i < 24; i++) {
		words[i] = token.nextToken();
	}
}

/**
 * Vraci pozice figur
 * @return pole s pozicemi
 */
public String[][] getBoardPositions() {
	return positions;
}

/**
 * Barva figur hrace na tahu
 * @return barva na tahu
 */
public String getColor() {
	return words[0];
}
\end{lstlisting}
\paragraph*{}
\paragraph*{}
\paragraph*{}
Další ukázka (výpis číslo \ref{src:time}) je výkonná část vlákna, která se stará o zobrazování času při hře na informačním panelu. V tomto vláknu jde o to, že se v cyklu, který probíhá pouze pokud je spuštěna hra, vlákno uspí vždy na jednu sekundu a poté odečte tuto sekundu hráči, který je zrovna na tahu.
\begin{lstlisting}[label=src:time,caption=Ukázka části vlákna obsluhující čas při hře na informačním panelu]
public void run() {
	while (true) {
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			logger.error("",e);
		}
		if (running) {
			if (time.isFirstActive()) {
				time.decreaseTimeOne();
			} else if (time.isSecondActive()) {
				time.decreaseTimeTwo();
			}
		}
	}
}
\end{lstlisting}
V následující ukázce (výpis číslo \ref{src:vykresleni_sachovnice}) se kód stará o vykreslení šachovnice na obrazovku.  Lze zde vidět trojice vnořených cyklů "for", které se starají o procházení všech 64 polí. V prvním z cyklů se zjišťuje, jestli má být některé z polí označeno jako stisknuté. V případě, že ano obarví se tenký okraj pole modrou barvou. V dalším cyklu se vykreslují samotná pole a to tak, že se střídají bílá a černá. V posledním cyklu se na pole vykreslí figura (pokud pole figuru obsahuje).
\begin{lstlisting}[label=src:vykresleni_sachovnice,caption=Ukázka vykreslení šachovnice]
for (int y = 0; y < height * 8; y += height) {
	for (int x = 0; x < width * 8; x += width) {
		g.setColor(colors[a % 2]);
		if (isPressed[x / width][y / height] == true) {
			g.setColor(new Color(0, 0, 190));
		} else if (moves[x / width][y / height] == true) {
			g.setColor(Color.BLUE);
		}
		g.fillRect(x, y, width, height);
		a++;
	}
	a++;
}
int desetina = width / 20;

for (int y = 0; y < height * 8; y += height) {
	for (int x = 0; x < width * 8; x += width) {
		g.setColor(colors[a % 2]);
		g.fillRect(x + desetina, y + desetina, width - (2 * desetina),
				height - (2 * desetina));
		a++;
	}
	a++;
}
for (int y = 0; y < height * 8; y += height) {
	for (int x = 0; x < width * 8; x += width) {
		if (positions[x / width][y / height] != null) {
			g.drawImage(pieces.get(positions[x / width][y / height]),
					x, y, width, height, null);
		}
	}
}
\end{lstlisting}


\subsection{Popis grafického rozhraní}
\subsubsection{Přihlášení}
Po spuštění aplikace se nabídne okno, díky kterému se nastavují parametry pro připojení na server. Okno obsahuje jak část pro registrovaného uživatele, tak pro neregistrovaného, kterému stačí kliknout na tlačítko "Přihlásit se jako uživatel".

\subsubsection{Menu}
Menu je rozděleno na následující položky:
\begin{description}
 \item[File:] slouží pro ovládání aplikace. Lze zde nalézt položky jako připojení / k serveru, odpojení, ukončení aplikace.
\item[Natavení:] v této části nalezneme nastavení jazyku aplikace a nastavení databázové části.
\item[Hra:] zde nalezneme funkce sloužící pro zpřístupnění některých funkcí serveru.
\item[Nápověda:] tato část obsahuje pouze informace o programu.
 \end{description}

\subsubsection{Vnitřní okna}
Nejpodstatnější část grafického rozhraní. Skládá se ze čtyř vnitřních oken, které slouží k pohodlnému ovládání hry.
\begin{description}
 \item[Šachovnice:] základní část 8 x 8 polí pro hru. Dále obsahuje informační panel pro zobrazení jmen hráčů a zobrazení aktuálního času v partii pro každého hráče. Vespod se nachází tlačítka pro snadné ovládání herních nabídek (zrušení hry, vzdání partie a odložení hry).
\item[Sought list:] jedná se o tabulku nabízených her oponenty na serveru. Na každém řádku je jedna nabízená hra. U jednotlivých nabídek je několik informací, které charakterizují danou hru. Mezi ně patří jméno hráče, který hru nabízí, délka partie, přírůstek (jedná se o čas na jeden tah), barva figur oponenta atd.
\item[Chat:] toto okno umožní komunikaci s ostatními uživateli, a to díky zobrazeným diskuzím na jednotlivých kanálech zobrazených za pomocí tabů. Kanály Shouts a Game jsou defaultní. Další taby závisí na tom, na jakých kanálech je uživatel přihlášený. Tab Shouts slouží pro zobrazování informací ze serveru, jako je třeba nabízení přihlašování na turnaje atd. Game obsahuje konverzaci uživatelem, který s vámi hraje partii. Dále okno obsahuje vstupní pole pro odesílání příspěvků, a to do toho kanálu, který je zrovna otevřený.
\item[Konzole:] Jedná se o výpis informací zasílaných serverem. Obsahuje také vstupní pole pro možnost ovládání všech služeb serveru.
 \end{description}
\subsubsection{Informativní okna}
Jedná se o vyskakovací okna, které informují uživatel o různých událostech. Například výsledek hry, nabídka partie oponentem atd.
\subsection{Další prvky implementace}
\subsubsection{Lokalizace}
Z důvodu, že se většině lidí lépe používají aplikace, které jsou v jejich rodném jazyce, jsem se rozhodl, že klient bude vícejazyčný. K tomuto účelu používám třídu ResourceBundle z Java API, která mi umožňuje rozdělit každou řeč do souboru označeného podle jazyku a s příponou properties. Díky této struktuře je velmi snadná rozšiřitelnost o další jazyky. Prozatím lze aplikaci možno nastavit pouze na dva jazyky a těmi jsou čeština a angličtina.
\subsubsection{Vlastní nastavení}
Vlastní nastavení je vytvořeno za pomoci Java Preferences API a slouží k tomu, aby se každému uživateli uchovávalo nastavení aplikace. V tomto klientu je této funkce použito k zapamatování uživatelského jména a hesla a dále k nastavení jazyku a statistik. Tyto informace se ukládají v každém uživatelském profilu OS zvlášť. Microsoft Windows si informace ukládá do registrů a Linux v domovském adresáři do XML souboru.
\subsubsection{Logování}
Logování slouží k odladění aplikace a odstranění chyb. V aplikaci používám k logování framework Log4J od společnosti Apache Software Foundation. Logování je nastaveno tak, aby se všechny důležité informace k ladění aplikace vypisovali v místě spuštění aplikace (při spuštění klienta přes konzoli) a zároveň zapisovali do souboru s názvem debug.log umístěného v kořenovém adresáři aplikace. Výpis do souboru slouží k tomu, aby při problémech s aplikací mohl uživatel logovací soubor předat vývojáři a ten podle něj zjistí, kde v programu nastala chyba, a je schopen ji opravit.
\subsection{Problémy při implementaci}
Při implementaci jsem se výhradně setkával s problémy při vytváření GUI za pomocí Swingu. Mezi největší nedostatky Swingu řadím složitost nastavení jednotlivých layoutů, se kterými jsem po celou dobu měl a stále mám problémy. Další problém se vyskytl při tvorbě konzole za pomocí komponenty TextArea. Tato komponenta v některých případech nepochopitelně nezobrazovala text, anebo přestalo fungovat scrolování. Tento problém byl vyřešen pomocí novější komponenty JTextArea. Mezi další problémy patřilo propojení jednotlivých vláken tak, aby mělo každé vlákno přístup k informacím ze serveru a také aby na server mohlo informace zasílat. Tato překážka byla vyřešena za pomoci PipedInputStreamu a PipedOutputStreamu.

\section{Použité technologie}
\label{sec:Technologie}
\subsection{Java}
Java je objektově orientovaný programovací jazyk vyvíjen firmou Sun Microsystems. Tento programovací jazyk je nezávislý na architektuře, což znamená, že aplikace vytvořená v tomto jazyce běží na libovolném operačním systému nebo libovolné architektuře. Tuto schopnost zajišťuje virtuální stroj Javy (JVM).
\begin{description}
\item[J2SE]
Java SE je část platformy Java určena pro desktopové aplikace. Pro tyto účely slouží API, které obsahuje například: Swing, Net (knihovna pro síťové funkce), Math (knihovna pro matematické funkce) a mnoho dalších.
\end{description}
% \begin{description}
%  \item[Lokalizace]
% \item[Preferences API]
% \item[JDBC]
%  \end{description}
\subsection{Log4J}
Log4J je logovací nástroj vyvíjen společností Apache Software Foundation. Tento nástroj slouží především pro ladění desktopových a webových aplikací. Technologie nabízí několik možností výpisu ladících informací, mezi které patří například systémový výstup, textový soubor, html soubor a další. Nástroj dále nabízí možnost rozlišení úrovní závažnosti zprávy, a to na kategorie: FATAL, ERROR, WARN, INFO, DEBUG a TRACE.
\subsection{MySQL}
Jedná se o databázový systém vyvíjen společností MySQL AB a nyní vlastněn společností Sun Microsystems. Tento systém je oblíbený například proto, že se jedná o volně šiřitelný software vydaný pod licencí GPL. Mezi podporované vlastnosti patří: cizí klíče, transakce, poddotazy, uložené procedury, triggery a pohledy.


\section{Závěr}
\label{sec:Conclusion}

\subsection{Shrnutí}
Cílem této bakalářské práce bylo seznámit se se službami serveru a naimplementovat klienta podporujícího co největší množství z těchto služeb. Pokusil jsem se, aby celé řešení bylo pokud možno ovladatelné přes grafické uživatelské rozhraní. Aplikaci jsem programoval v jazyce Java, který má pro mne vyhovující syntaxi a výborná API. Tento jazyk také zajistil jeden z mých požadavků, a to aby byla aplikace spustitelná na operačním systému Linux. Vytvořená aplikace obsahuje navíc, oproti zadání, podporu statistik díky vytvořené podpoře databázových funkcí. Pro databázi jsem využil SŘBD MySQL, které podmínku přenositelnosti také splňuje.
\subsection{Další vývoj}
Na vývoji aplikace bych chtěl dále pokračovat, protože jsem příznivcem šachu a hra přes internet mi nabízí jedinou možnost jak tuto hru hrát. V prvé řadě bych chtěl dát aplikaci volně k dispozici hráčům na FICS serveru a vytvořit webové stránky, kde by uživatelé mohli navrhovat další funkce klienta a hlásit případné chyby. Dále bych se chtěl ve vývoji spojit s nějakými grafiky, kteří by tvořili figury a šachová pole pro větší přizpůsobení hraní každému jednotlivci. V rámci toho bych chtěl najít někoho, kdo by uměl modelovat figury i ve 3D, abych mohl doimplementovat i podporu hry ve 3D. Další vývoj by se měl týkat funkcí statistiky, protože statistické služby serveru jsou opravdu nevyhovující. Mělo by se jednat například o možnost zobrazení odehraných partií na šachovnici, a to včetně automatického přehrávání partií. A v neposlední řadě by šlo o větší multijazyčnost, v čemž by mi opět musel někdo pomoci, protože kromě češtiny a angličtiny jiné jazyky neovládám.


\bigskip

\begin{flushright}
David Juráň
\end{flushright}




% \begin{thebibliography}{99}
% 
% \bibitem{goossens94} Goossens, Michel,
% \textit{The \LaTeX\ companion,} New York: Addison, 1994.
% 
% \bibitem{lamport94} Lamport, Leslie,
% \textit{\LaTeX: a document preparation system: user's guide and reference manual},
% New York: Addison-Wesley Pub. Co., 1994.
% 
% \end{thebibliography}

% 
\appendix
\section{Náhledy jednotlivých klientů}
Na obrázcích číslo \ref{fig:babas}, \ref{fig:jin}, \ref{fig:xboard}, \ref{fig:knights} a \ref{fig:javaboard} lze vidět screenshoty z jednotlivých již dříve popsaných klientů v kapitole číslo \ref{sec:Exist}.
\InsertFigure{babas}{0.3\textheight}{Screenshot aplikace BabasChess}{fig:babas}
\InsertFigure{jin}{0.3\textheight}{Screenshot aplikace Jin}{fig:jin}
\InsertFigure{xboard}{0.3\textheight}{Screenshot aplikace XBoard}{fig:xboard}
\InsertFigure{knights}{0.3\textheight}{Screenshot aplikace Knights}{fig:knights}
\InsertFigure{javaboard}{0.3\textheight}{Screenshot aplikace JavaBoard}{fig:javaboard}
% \clearpage
% \section{Instalace a spuštění aplikace}
% \subsection*{Softwarové požadavky}
% \begin{itemize}
%  \item Java Sun Java Runtime Environment
%  \item Apache server\footnote[1]{Není nutné instalovat, jestliže není potřeba databázových funkcí.}
%  \item MySQL databaze\footnotemark[1]
% \end{itemize}
% 
% \subsection*{Instalace}
% \subsubsection*{Aplikace}
% Aplikaci není třeba instalovat. Stačí tedy pouze rozbalit archív obsahující aplikaci.
% \subsubsection*{Databáze}
% Je třeba importovat strukturu databáze. Před importem se ujistěte, že vám již běží Apache server a MySQL daemon. SQL skript se strukturou je umístěn v adresářové struktuře ve složce Resources a její podsložce Database. Postup importu skriptu: 
% \begin{itemize}
%  \item spustit MySQL příkazem - \textbf{mysql} popřípadě \textbf{mysql.exe}
%  \item import pomocí příkazu - \textbf{source DatabaseStruct.sql;}
% \end{itemize}
% Dále je třeba v aplikaci nastavit jméno a heslo pro přístup k databázi. Toto nastavení provedete v horním menu v položce Nastavení$->$ Databáze.
% \subsection*{Spuštění}
% Aplikaci na systémech Linux spustíte skriptem \textbf{doveChess}, který je umístěn v kořenu adresářové struktury aplikace. Popřípadě lze aplikaci spustit univerzálním způsobem v případě aplikací java v podobě jar souboru. A to pomocí příkazu \textbf{java -jar doveChess.jar}.
\end{document}
